package com.youth.config;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;

import javax.servlet.http.HttpServletRequest;

/**
 * @ClassName AccessFilter
 * @Description: TODO
 * @Author oops
 * @Date 2019/10/18 9:49
 **/
public class AccessFilter extends ZuulFilter {
    @Value("${server.port}")
    private String serverPort;

    /**
     * @MethodName: filterType
     * @Description: TODO 过滤器的类型。决定过滤器在请求生命周期的哪一个阶段发挥作用
     * pre 路由转发之前过滤，用于请求的过滤和校验。
     * routing 在路由转发时调用，路由请求转发，即是将请求转发到具体的服务实例上去。
     * post  在routing和error过滤器之后进行调用，post请求用于对请求结果进行加工。
     * @Param: * @param
     * @Return: {@link java.lang.String}
     * @Author: yjwu
     * @Date: 2019/10/18 9:50
     **/
    @Override
    public String filterType() {
        return "pre";
    }

    /**
     * @MethodName: filterOrder
     * @Description: TODO * 此方法用于指定过滤器执行顺序。
     * * 当一个阶段有多个过滤器时，需要用此指定执行顺序，数值越小优先级越高。
     * @Param: * @param
     * @Return: {@link int}
     * @Author: yjwu
     * @Date: 2019/10/18 9:53
     **/
    @Override
    public int filterOrder() {
        return 0;
    }

    /**
     * @MethodName: shouldFilter
     * @Description: TODO 判断过滤器是否执行，直接返回true，表示对所有请求都进行过滤。
     * * 此方法用于制定过滤范围。
     * @Param: * @param
     * @Return: {@link boolean}
     * @Author: yjwu
     * @Date: 2019/10/18 9:53
     **/
    @Override
    public boolean shouldFilter() {
        return false;
    }

    /**
     * @MethodName: run
     * @Description: TODO 过滤的具体逻辑。
     * @Param: * @param
     * @Return: {@link Object}
     * @Author: yjwu
     * @Date: 2019/10/18 9:53
     **/
    @Override
    public Object run() throws ZuulException {
        System.out.println("zuuuuuuollllll------------------------");
        //1 获取上下文
        RequestContext currentContext = RequestContext.getCurrentContext();
        // 2 获取request
        HttpServletRequest request = currentContext.getRequest();
        // 3 从请求中获取token，
        String token = request.getParameter("token");
        String uri = request.getRequestURI();
        StringBuffer urlStringBuffer = request.getRequestURL();
        String url = new String(urlStringBuffer);
        request.setAttribute("serverPort", serverPort);

        System.out.println("Pre Filter8005: Request Method : " + request.getMethod() + " " +
                ",Request URL : " + request.getRequestURL().toString() + "  ,token :" + token + ",url=" + url);
        if (url.indexOf("/api-docs") != -1) {
            currentContext.setSendZuulResponse(true);
            currentContext.setResponseBody("token is needless");
            currentContext.setResponseStatusCode(200);
        } else {
            if (StringUtils.isEmpty(token)) {
                // 不会继续执行，不会调用服务接口了。网关服务之直接响应给客户端。
                currentContext.setSendZuulResponse(false);
                currentContext.setResponseBody("token is null");
                currentContext.setResponseStatusCode(200);
                //返回一个错误提示
            }
        }
        //正常执行。调用其它服务接口。
        System.out.println("网关服务执行，端口为：" + serverPort);
        return null;
    }
}
